/* 
 *  Description  เอาไว้คำนวนส่วน ในกรณี  ที่มีรายการร่วม  
 *  แต่ส่วนนี้ยังไม่ได้   Where ที่เป็นวันที่ 
 */
 package df.bean.process;

 import df.bean.db.conn.DBConnection;
import java.sql.ResultSet;
import java.sql.SQLException;

 /**
  * @author Mr.sarunyoo Keawsopa
  */

public class ProcessComposit_bk {
	private DBConnection obj_conn = null;;
	private ResultSet rs  = null;
	private String hospital_code = "";
	private String date_start = "";
	private String date_end = "";
	//private double percent = 0;
	/*
    public static void main(String[] args) throws Exception{		
		try{
			 //  20101231
		    // System.out.print(new ProcessComposit().calculateComposite("00009", "20100101" , "20110525")? "pass" : "faila");  
			 //System.out.print(new ProcessComposit().rollBackComposite("00009", "20100101" , "20110525")? "pass" : "fail");
		} catch(Exception ex) { 
			System.out.print(" er : " + ex);
		}
    } */
	
    public boolean calculateComposite(String hospital_code, String date_start, String date_end){ 
    	boolean action = false;  
    	this.hospital_code = hospital_code;  // set รหัสโรงพยาบาล 
    	this.date_start = date_start;		 // set วันที่เริ่มการคำนวน
    	this.date_end = date_end;		     // set วันที่สิ้นสุดการทำงาน
   	 
    	try{ 
    	obj_conn = new DBConnection(); 
    	obj_conn.connectToLocal();
    
    	
        this.backupSsoTransaction();  //  back up data before
    	this.rs = this.getResultComposite();   //ค้นหารายการที่เป็น "ประกันสังคม"
    	
    	while(this.rs.next()){  // ดึงรายการแต่ละ   LINE_NO    		
    		// เริ่มทำการประมวผล    Composite แต่ละ .. LINE_NO
    		 this.toPaidComposite(this.rs.getString("LINE_NO"));
    	} 
    		action = true;
        	
    	} catch(Exception ex) { 
    		 System.out.print(ex);
    	} finally {
    	//this.rs.close();
    	this.obj_conn.Close();
 
    	}
    	
    	return action;
	}
    
    private boolean backupSsoTransaction(){
    	boolean status = true;
    	String sql = "UPDATE TRN_DAILY "+
    	"SET OLD_DR_AMT = DR_AMT, HP_TAX = HP_AMT, "+
    	"OLD_TAX_AMT = DR_TAX_400+DR_TAX_401+DR_TAX_402+DR_TAX_406, "+
    	"OLD_NOR_ALLOCATE_PCT = NOR_ALLOCATE_PCT "+
    	"WHERE HOSPITAL_CODE = '" + this.hospital_code + "' AND "+
    	"(TRANSACTION_DATE BETWEEN '" + this.date_start + "' AND '" + this.date_end + "') AND "+
    	"LINE_NO IN (SELECT LINE_NO FROM TRN_DAILY  WHERE LINE_NO IN ("+
    	"SELECT LINE_NO FROM TRN_DAILY TD "+
    	"INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE "+
    	"AND POS.HOSPITAL_CODE = TD.HOSPITAL_CODE "+
    	"WHERE TD.HOSPITAL_CODE = '" + this.hospital_code + "' ) "+
    	"AND HOSPITAL_CODE = '" + this.hospital_code + "' "+
    	"AND ACTIVE  = '1' "+
    	"AND TRANSACTION_DATE BETWEEN '" + this.date_start + "' AND '" + this.date_end + "' "+
    	"GROUP BY LINE_NO HAVING COUNT(LINE_NO) > 1)";
    	try{
    		obj_conn.executeUpdate(sql);
    	}catch(Exception e){
    		status = false;
    		System.out.println("Backup SSO Transaction error :  " + e);
    	}
    	return status;
    }
    
	private double getPercent(String lineNo){
		String percentage = "";
		double temp_percentage = 0;
		String sql = "SELECT TOP 1 NOR_ALLOCATE_PCT FROM TRN_DAILY TD "+
		"INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE "+
		"AND POS.HOSPITAL_CODE = TD.HOSPITAL_CODE "+
		"WHERE TD.HOSPITAL_CODE = '" + this.hospital_code + "' AND LINE_NO = '" +lineNo+"' "+
		"AND (TRANSACTION_DATE BETWEEN '" + this.date_start + "' AND '" + this.date_end + "')";
		percentage = obj_conn.executeQueryString(sql);
		if("".equals(percentage) || percentage == null){				 //  กรณีไม่มีรายการ...
			temp_percentage  = 0.32;    // กำหนดค่าเริ่ม ต้น   กรณี ..ที่  รายการ  ประกันสังคม  ไม่มีค่าอะไร..
		} else  { 
			temp_percentage  =  Double.parseDouble(percentage) / 100;   // กำำหนดให้รายการเป็นดังนี้   .9  or  .97   
		}
		
		return temp_percentage;
	}
	private ResultSet getResultComposite(){ 
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT LINE_NO FROM TRN_DAILY  WHERE LINE_NO IN (");
		sql.append(" SELECT LINE_NO FROM TRN_DAILY TD");     
		sql.append(" INNER JOIN PAYOR_OFFICE_SC POS ON POS.PAYOR_OFFICE_CODE_SC = TD.PAYOR_OFFICE_CODE");    
		sql.append(" WHERE TD.HOSPITAL_CODE = '").append(this.hospital_code).append("' )"); 
		sql.append(" AND HOSPITAL_CODE = '").append(this.hospital_code).append("'"); 
		sql.append(" AND ACTIVE  = '1'");  //  ตรวจสอบเรื่องทำงานของ Record
		sql.append(" AND  TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		sql.append(" GROUP BY LINE_NO"); 
		sql.append(" HAVING COUNT(LINE_NO) > 1 ");
		
		return  this.obj_conn.executeQuery(sql.toString());
	}
    private int toPaidComposite(String line_no) throws Exception{ 
    	double sumSc = 0;
    	double sumWalkIn = 0 ;
    	double sscPercent = 0;
    	int actionRecord = 0 ;
		
    	sscPercent = this.getPercent(line_no);  
    	sumSc = this.getSumSC(line_no , sscPercent);  // รวมยอด ทั้งหมด  รายการที่เป็นประกันสังคม
    	sumWalkIn =  this.getSumWalkinAndContact(line_no); // รวมยอด ทั้งหมด  รายการที่เป็น  ผู้ป่วยทั่วไป    และ  ประกันสุขภาพ 
		
    	if(sumSc > sumWalkIn) {   	 				// กรณีที่จ่ายด้วยประกันสังคม 
    		this.paidSsc(line_no); 
    		actionRecord =  1; 						// ทำเพื่อเก็บ..จำนวนครั้งทำที่ได้	 
    	}else{ 			 							// กรณีให้ "ผู้่ป่วยทั่วไป  และ ประกันสุขภาพ" จ่าย 
    		this.paidWalkInContract(line_no);
    		actionRecord =  1;  					// ทำเพื่อเก็บ..จำนวนครั้งที่ทำได้
    	}			  	  
		  
    	sumSc = 0;		// set default
    	sumWalkIn = 0;	// set default 
    	return actionRecord;
    }
    private double getSumSC(String line_no ,  double percentTax) {
    	double  price_amt  = 0.0;
		StringBuilder  sql =  new StringBuilder();
		ResultSet  rs_get_price_sc = null;
		sql.append("SELECT AMOUNT_AFT_DISCOUNT, NOR_ALLOCATE_PCT FROM  TRN_DAILY");
		sql.append(" WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
	    sql.append(" AND  LINE_NO = '").append(line_no).append("'");
	    sql.append(" AND  TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		
		try {	
			this.obj_conn.connectToLocal();
			rs_get_price_sc = obj_conn.executeQuery(sql.toString());
			while(rs_get_price_sc.next()) { 
				//  กำหนดค่ารวมแต่ละรายการำ
				price_amt += rs_get_price_sc.getDouble("AMOUNT_AFT_DISCOUNT") *  percentTax;
			}
		} catch(Exception ex ){ 
			System.out.print(ex);
		} finally{
		 // rs_get_price_sc.close(); 
			
		}
		// return value
		return price_amt;
	}
    private double getSumWalkinAndContact(String line_no) throws Exception {
		double priceReturn  = 0.0 ;		
		StringBuilder  sql = new StringBuilder();
		ResultSet rs_get_price_walk = null;
		try { 		
			sql.append("SELECT  DR_AMT FROM  TRN_DAILY");
			sql.append(" WHERE HOSPITAL_CODE  = '").append(hospital_code).append("'");
			sql.append(" AND LINE_NO = '").append(line_no).append("'");
			sql.append(" AND PAYOR_OFFICE_CODE NOT IN ( SELECT PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC )");
			sql.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		
			this.obj_conn.connectToLocal();
			rs_get_price_walk =  obj_conn.executeQuery(sql.toString());
			while(rs_get_price_walk.next()) { 
				priceReturn += rs_get_price_walk.getDouble("DR_AMT");				
			}
		} catch(Exception ex) {
			System.out.print("Error Exception : " + ex);
		} finally {
			//rs_get_price_walk.close();
		}
		//return value walk in & contact
		return priceReturn;
	}
    public boolean rollBackComposite(String hospital_code, String date_start, String date_end) { 
    	System.out.println(hospital_code+":"+date_start+":"+date_end);
    	obj_conn = new DBConnection();
    	obj_conn.connectToLocal();
    	boolean action = false;
     	StringBuilder sql = new StringBuilder();
     	
     	// ส่วนนี้ ผมไม่ค่อยแน่ใจเท่าไรนะครับผม
     	sql.append(" UPDATE TRN_DAILY ");
     	sql.append("SET ");
     	sql.append("DR_AMT = OLD_DR_AMT, OLD_DR_AMT = 0, ");
     	sql.append("HP_AMT = HP_TAX,  HP_TAX  = 0, ");
     	sql.append("NOR_ALLOCATE_PCT = OLD_NOR_ALLOCATE_PCT, OLD_NOR_ALLOCATE_PCT = 0, ");
     	sql.append("DR_TAX_400 = CASE WHEN TAX_TYPE_CODE = '400' THEN OLD_TAX_AMT ELSE 0 END, ");   //  400  
	    sql.append("DR_TAX_401 = CASE WHEN TAX_TYPE_CODE = '401' THEN OLD_TAX_AMT ELSE 0 END, "); 	  //  401
	    sql.append("DR_TAX_402 = CASE WHEN TAX_TYPE_CODE = '402' THEN OLD_TAX_AMT ELSE 0 END, ");	  //  402
	    sql.append("DR_TAX_406 = CASE WHEN TAX_TYPE_CODE = '406' THEN OLD_TAX_AMT ELSE 0 END, ");      //  406
      	sql.append("OLD_TAX_AMT = 0 ");    														      //  set  OLD_TAX_AMT  defalt 0
	    sql.append("WHERE HOSPITAL_CODE = '").append(hospital_code).append("' ");
     	sql.append("AND TRANSACTION_DATE BETWEEN '").append(date_start).append("' AND '").append(date_end).append("' ");
     	sql.append("AND OLD_NOR_ALLOCATE_PCT > 0 "); // ตามข้อตกลงกัน  เอา OLD_NOR_ALLOCATE_PCT  เป็นตัว check  ว่า รายการใด .. นั้น.. ได้ทำเสร็จแล้ว.. แล้วจะมา ตรวจสอบการทำงาน ..  เพื่อที่จะ Rollback Data bases
     	sql.append("AND OLD_NOR_ALLOCATE_PCT IS NOT NULL"); 
     	
     	try{
     		action = this.obj_conn.executeUpdate(sql.toString())>= 0 ? true : false;
     	} catch(Exception ex) {
     		this.obj_conn.Close();
     	 	System.out.println(ex);     			
     	} finally {
     		this.obj_conn.Close();
     	}
     	return action;
    }      
    private int paidSsc(String line_no) throws Exception { 
    	int actionRecord  = 0;
    	double percent = this.getPercent(line_no);
		StringBuilder  sql =  new StringBuilder();
		
		sql.append("UPDATE TRN_DAILY ");
		sql.append("SET DR_AMT = AMOUNT_AFT_DISCOUNT * ").append(percent).append(" , ");
		sql.append("DR_TAX_400 = CASE WHEN TAX_TYPE_CODE = '400' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_401 = CASE WHEN TAX_TYPE_CODE = '401' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_402 = CASE WHEN TAX_TYPE_CODE = '402' THEN DR_AMT * TAX_RATE ELSE 0 END, ");
		sql.append("DR_TAX_406 = CASE WHEN TAX_TYPE_CODE = '406' THEN DR_AMT * TAX_RATE ELSE 0 END, ");		 
		sql.append("NOR_ALLOCATE_PCT = ").append(percent * 100).append(" , ");  // format เป็น  70  หรือ เป็นเต็มร้อยนั้นเอง     ร้อย  32.00
		sql.append("HP_AMT = AMOUNT_AFT_DISCOUNT - (AMOUNT_AFT_DISCOUNT * ").append(percent).append(") ");
		sql.append("WHERE HOSPITAL_CODE  = '").append(this.hospital_code).append("' ");
		sql.append("AND LINE_NO = '").append(line_no).append("' ");
		sql.append("AND TRANSACTION_DATE  BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		try{
			 		if(obj_conn.executeUpdate(sql.toString()) != -1) { 
			 			actionRecord = 1;
			 		}
		 } catch(Exception ex) {
			 System.out.println(ex);
		 }
		return  actionRecord;
	}
	private int paidWalkInContract(String line_no)throws Exception{ 
		StringBuilder sql_update = new StringBuilder();
		int  recordComplete  = 0 ;
		sql_update.append("UPDATE TRN_DAILY SET");
		sql_update.append(" DR_AMT = 0, ");				// DR_AMT  ส่วนแบ่ง แพทย์
		sql_update.append(" HP_AMT  = 0, ");			// HP_AMT  ส่วนแบ่ง  โรงพยาบาล
		sql_update.append(" NOR_ALLOCATE_PCT = 0, ");   // NOR_ALLOCATE_PCT  
		sql_update.append(" DR_TAX_400 = 0, ");
		sql_update.append(" DR_TAX_401 = 0, ");
		sql_update.append(" DR_TAX_402 = 0, ");
		sql_update.append(" DR_TAX_406 = 0 ");
		sql_update.append(" WHERE  HOSPITAL_CODE = '").append(this.hospital_code).append("'");
		sql_update.append(" AND LINE_NO = '").append(line_no).append("'");
		sql_update.append(" AND PAYOR_OFFICE_CODE IN (SELECT PAYOR_OFFICE_CODE_SC FROM PAYOR_OFFICE_SC WHERE HOSPITAL_CODE = '").append(this.hospital_code).append("')");
		//sql_update.append(" AND INVOICE_NO = '").append(invoice_no).append("'");
		sql_update.append(" AND TRANSACTION_DATE BETWEEN '").append(this.date_start).append("' AND '").append(this.date_end).append("'");
		try{
				if(obj_conn.executeUpdate(sql_update.toString()) !=  -1)  { 
					recordComplete = 1; 
				}
		} catch(Exception ex){
			System.out.print(ex);
		}
		return recordComplete;
	}
} // end class

